package gm.data;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.file.Path;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

/**
 * JSON segédosztály.
 *
 * @author imruf84
 */
public class JSONUtils {

    /**
     * JSON objektum átalakítása karakterlánccá.
     *
     * @param json objektum
     * @return karakterlánc
     * @throws IOException kivétel
     */
    @SuppressWarnings("unchecked")
    public static String JSONToString(JSONObject json) throws IOException {

        StringWriter sw = new StringWriter();
        json.writeJSONString(sw);
        return sw.toString();
    }

    /**
     * JSON objektum fájlba írása.
     *
     * @param json objektum
     * @param filePathName fájlnév
     * @throws IOException kivétel
     */
    @SuppressWarnings("unchecked")
    public static void JSONToFile(JSONObject json, String filePathName) throws IOException {

        String dataToSave = JSONUtils.JSONToString(json);
        try (BufferedWriter out = new BufferedWriter(new FileWriter(filePathName))) {
            out.write(dataToSave);
            out.close();
        }
    }

    /**
     * JSON objektum beolvasása fájlból.
     *
     * @param filePathName fájlnév
     * @return objektum
     * @throws FileNotFoundException kivétel
     */
    @SuppressWarnings("unchecked")
    public static JSONObject JSONFromFile(String filePathName) throws FileNotFoundException {

        BufferedReader in = new BufferedReader(new FileReader(filePathName));
        return (JSONObject) JSONValue.parse(in);
    }

    /**
     * Alapvető fonal objektum mentése fájlba.
     *
     * @param p fájlnév elérési úttal
     * @param bwd tárolandó objektum
     * @throws java.io.IOException kivétel
     */
    @SuppressWarnings("unchecked")
    public static void basicWoolDataToFile(Path p, BasicWoolData bwd) throws IOException {

        JSONObject json = new JSONObject();
        json.put("index", bwd.woolIndex);
        json.put("symbol", bwd.symbol);
        json.put("red", bwd.color[0]);
        json.put("green", bwd.color[1]);
        json.put("blue", bwd.color[2]);
        json.put("count", bwd.count);

        JSONUtils.JSONToFile(json, p.toString());

    }

    /**
     * Alapvetú lyukinformáció tárolása fájlba.
     *
     * @param p fájlnév elérési úttal
     * @param bhd lyuk
     * @throws IOException kivétel
     */
    @SuppressWarnings("unchecked")
    public static void basicHoleDataToFile(Path p, BasicHoleData bhd) throws IOException {

        JSONObject json = new JSONObject();
        json.put("woolIndex", bhd.woolIndex);
        json.put("index", bhd.holeIndex);
        json.put("x", bhd.holePosition[0]);
        json.put("y", bhd.holePosition[1]);

        JSONUtils.JSONToFile(json, p.toString());
    }

    /**
     * Alapvetú lyukinformáció tárolása fájlba.
     *
     * @param p fájlnév elérési úttal
     * @param bhd lyuk
     * @throws IOException kivétel
     */
    @SuppressWarnings("unchecked")
    public static void basicServerHoleDataToFile(Path p, BasicMotorHoleData bhd) throws IOException {

        JSONObject json = new JSONObject();
        json.put("x", bhd.holePosition[0]);
        json.put("y", bhd.holePosition[1]);
        json.put("mx", bhd.motorPosition[0]);
        json.put("my", bhd.motorPosition[1]);

        JSONUtils.JSONToFile(json, p.toString());
    }

}
